package com.example.waitdemo.config;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * @Description     自定义参数解析器需要实现 HandlerMethodArgumentResolver 接口，这个接口中就两个方法：
 *                      supportsParameter：该方法表示是否启用这个参数解析器，返回 true 表示启用，返回 false 表示不启用。
 *                      resolveArgument：  这是具体的解析过程，就是从 request 中取出参数的过程，方法的返回值就对应了接口中参数的值。
 *                      自定义参数解析器只需要实现该接口即可。
 *                      【
 *              我们再将自定义的参数解析器配置到 HandlerAdapter 中，配置方式如下：
 *              @Configuration
 *              public class WebConfig implements WebMvcConfigurer {
 *                  @Override
 *                  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
 *                      resolvers.add(new CurrentUserNameHandlerMethodArgumentResolver());
 *                  }
 *              }
 *                      】
 * @ClassName CurrentUserNameHandlerMethodArgumentResolver
 * @Author jiang_11445266119198
 * @Date 2022/7/12 12:56
 */
public class CurrentUserNameHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    /**
     * @Description         如果参数类型是 String，并且参数上有 @CurrentUserName 注解，则使用该参数解析器。
     *                      用于判断是否支持对某种参数的解析(支持则返回true)
     * @Param : parameter
     * @return boolean
     * @Author 江
     * @Date 2022/7/12 12:58
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(String.class)&&parameter.hasParameterAnnotation(CurrentUserName.class);

    }

    /**
     * @Description         方法的返回值就是参数的具体值
     *                      将请求中的参数值解析为某种对象(具体的操作获取解析对象)
     * @Param : parameter
     * @Param : mavContainer
     * @Param : webRequest
     * @Param : binderFactory
     * @return Object
     * @Author 江
     * @Date 2022/7/12 13:03
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return null;
    }
}
